class Solution {
    public boolean buddyStrings(String s, String goal) {
        // 三种情况  长度不同或某个字母出现频次不同 false  
        //          字母不同的位数为2                                               diffCnt == 2
        //          字母全部相同 但是某个字母出现频次大于等于2  可以自己和自己换        (diffCnt == 0 && maxCharCnt > 1)
        int slen = s.length();
        int goallean = goal.length();
        if(slen != goallean) return false;
        int[] sarr = new int[26];
        int[] goalarr = new int[26];
        int diffCnt = 0, maxCharCnt = 0;
        for(int i = 0; i < slen; i++) {
            int si = s.charAt(i) - 'a';
            int goali = goal.charAt(i) - 'a';
            sarr[si] ++;
            goalarr[goali] ++;
            if(si != goali) diffCnt++;
        }

        for(int i = 0; i < 26; i++) {
            if(sarr[i] != goalarr[i]) {
                return false;
            } else {
                maxCharCnt = Math.max(sarr[i], maxCharCnt);
            }

        }
        return (diffCnt == 2) || (diffCnt == 0 && maxCharCnt > 1); // 刚好两个不同 或者出现频次最多的字符频次大于2  可以互换相同字符
    }
}